import { Controller, Get, Post, Body, Patch, Param, Delete, Query } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse, ApiBody, ApiParam, ApiQuery } from '@nestjs/swagger';
import { ConfigurationService } from './configuration.service';
import { IPaginationFormWithCondition } from 'types/requestParams';
import { Swiper } from '@libs/db/models/swiper.model';
import { EmailConfig } from '@libs/db/models/email-config.model';
import { Public } from 'src/decorations/public.decorator';
import { EmailService } from '../email/email.service';
import * as fs from 'fs';
import * as path from 'path';

@ApiTags('配置管理')
@Controller('configuration')
export class ConfigurationController {
  constructor(
    private readonly ConfigurationService: ConfigurationService,
    private readonly emailService: EmailService
  ) { }

  // ========== 站点信息相关接口 ==========

  /**
   * 创建站点信息
   * @param body 站点信息数据，来源于请求体
   * @returns 创建的站点信息
   */
  @Post('createSiteInfo')
  async createSiteInfo(@Body() body) {
    return await this.ConfigurationService.createSiteInfo(body);
  }

  /**
   * 获取站点信息
   * @returns 站点信息详情
   */
  @Get('getSiteInfo')
  async getSiteInfo() {
    return await this.ConfigurationService.getSiteInfo();
  }

  /**
   * 更新站点信息
   * @param id 站点信息ID，来源于路径参数
   * @param body 更新的站点信息数据，来源于请求体
   * @returns 更新结果消息
   */
  @Patch('updateSiteInfo/:id')
  async updateSiteInfo(@Param('id') id: string, @Body() body) {
    return await this.ConfigurationService.updateSiteInfo(id, body);
  }

  /**
   * 删除站点信息
   * @param id 站点信息ID，来源于路径参数
   * @returns 删除结果消息
   */
  @Delete('site-info/:id')
  async removeSiteInfo(@Param('id') id: string) {
    return await this.ConfigurationService.removeSiteInfo(id);
  }

  // ========== 公司信息相关接口 ==========

  /**
   * 创建公司信息
   * @param body 公司信息数据，来源于请求体
   * @returns 创建的公司信息
   */
  @Post('createCompanyInfo')
  async createCompanyInfo(@Body() body) {
    return await this.ConfigurationService.createCompanyInfo(body);
  }

  /**
   * 获取公司信息
   * @returns 公司信息详情
   */
  @Get('getCompanyInfo')
  async getCompanyInfo() {
    return await this.ConfigurationService.getCompanyInfo();
  }

  /**
   * 更新公司信息
   * @param id 公司信息ID，来源于路径参数
   * @param body 更新的公司信息数据，来源于请求体
   * @returns 更新结果消息
   */
  @Patch('updateCompanyInfo/:id')
  async updateCompanyInfo(@Param('id') id: string, @Body() body) {
    return await this.ConfigurationService.updateCompanyInfo(id, body);
  }

  /**
   * 删除公司信息
   * @param id 公司信息ID，来源于路径参数
   * @returns 删除结果消息
   */
  @Delete('company-info/:id')
  async removeCompanyInfo(@Param('id') id: string) {
    return await this.ConfigurationService.removeCompanyInfo(id);
  }

  /**
   * 获取站点信息、公司信息和菜单的组合数据
   * @returns 包含站点信息、公司信息和菜单的对象结构 {siteInfo:{}, companyInfo:{}, menus:[]}
   */
  @Get('getSiteAndCompanyInfo')
  @ApiOperation({ summary: '获取站点信息、公司信息的组合数据' })
  @ApiResponse({ status: 200, description: '获取成功', schema: { type: 'object', properties: { siteInfo: { type: 'object' }, companyInfo: { type: 'object' }, menus: { type: 'array', items: { type: 'object' } } } } })
  @ApiResponse({ status: 500, description: '服务器错误' })
  @Public()
  async getSiteAndCompanyInfo() {
    return await this.ConfigurationService.getSiteAndCompanyInfo();
  }

  // ========== 邮件配置相关接口 ==========

  /**
   * 创建邮件配置
   * @param body 邮件配置数据，来源于请求体
   * @returns 创建的邮件配置
   */
  @Post('createEmailConfig')
  @ApiOperation({ summary: '创建邮件配置' })
  @ApiResponse({ status: 201, description: '创建成功' })
  @ApiResponse({ status: 500, description: '服务器错误' })
  @ApiBody({ type: EmailConfig })
  async createEmailConfig(@Body() body: EmailConfig) {
    return await this.ConfigurationService.createEmailConfig(body);
  }

  /**
   * 获取所有邮件配置
   * @returns 邮件配置列表
   */
  @Get('getAllEmailConfigs')
  @ApiOperation({ summary: '获取所有邮件配置' })
  @ApiResponse({ status: 200, description: '获取成功' })
  @ApiResponse({ status: 500, description: '服务器错误' })
  async getAllEmailConfigs() {
    return await this.ConfigurationService.getAllEmailConfigs();
  }

  /**
   * 获取活跃的邮件配置
   * @returns 活跃的邮件配置
   */
  @Get('getActiveEmailConfig')
  @ApiOperation({ summary: '获取活跃的邮件配置' })
  @ApiResponse({ status: 200, description: '获取成功' })
  @ApiResponse({ status: 500, description: '服务器错误' })
  @Public()
  async getActiveEmailConfig() {
    return await this.ConfigurationService.getActiveEmailConfig();
  }

  /**
   * 根据ID获取邮件配置
   * @param id 邮件配置ID，来源于路径参数
   * @returns 邮件配置详情
   */
  @Get('getEmailConfig/:id')
  @ApiOperation({ summary: '根据ID获取邮件配置' })
  @ApiResponse({ status: 200, description: '获取成功' })
  @ApiResponse({ status: 404, description: '邮件配置不存在' })
  @ApiResponse({ status: 500, description: '服务器错误' })
  @ApiParam({ name: 'id', description: '邮件配置ID' })
  async getEmailConfigById(@Param('id') id: string) {
    return await this.ConfigurationService.getEmailConfigById(id);
  }

  /**
   * 更新邮件配置
   * @param id 邮件配置ID，来源于路径参数
   * @param body 更新的邮件配置数据，来源于请求体
   * @returns 更新结果消息
   */
  @Patch('updateEmailConfig/:id')
  @ApiOperation({ summary: '更新邮件配置' })
  @ApiResponse({ status: 200, description: '更新成功' })
  @ApiResponse({ status: 404, description: '邮件配置不存在' })
  @ApiResponse({ status: 500, description: '服务器错误' })
  @ApiParam({ name: 'id', description: '邮件配置ID' })
  @ApiBody({ type: EmailConfig })
  async updateEmailConfig(@Param('id') id: string, @Body() body: Partial<EmailConfig>) {
    return await this.ConfigurationService.updateEmailConfig(id, body);
  }

  /**
   * 删除邮件配置
   * @param id 邮件配置ID，来源于路径参数
   * @returns 删除结果消息
   */
  @Delete('removeEmailConfig/:id')
  @ApiOperation({ summary: '删除邮件配置' })
  @ApiResponse({ status: 200, description: '删除成功' })
  @ApiResponse({ status: 404, description: '邮件配置不存在' })
  @ApiResponse({ status: 500, description: '服务器错误' })
  @ApiParam({ name: 'id', description: '邮件配置ID' })
  async removeEmailConfig(@Param('id') id: string) {
    return await this.ConfigurationService.removeEmailConfig(id);
  }

  /**
   * 激活指定的邮件配置
   * @param id 邮件配置ID，来源于路径参数
   * @returns 激活结果消息
   */
  @Patch('activateEmailConfig/:id')
  @ApiOperation({ summary: '激活指定的邮件配置' })
  @ApiResponse({ status: 200, description: '激活成功' })
  @ApiResponse({ status: 404, description: '邮件配置不存在' })
  @ApiResponse({ status: 500, description: '服务器错误' })
  @ApiParam({ name: 'id', description: '邮件配置ID' })
  async activateEmailConfig(@Param('id') id: string) {
    return await this.ConfigurationService.activateEmailConfig(id);
  }

  /**
   * 测试发送邮件
   * @param body 测试邮件内容数据，来源于请求体
   * @returns 发送结果
   */
  @Get('testSendEmail')
  @ApiOperation({ summary: '测试发送邮件' })
  @ApiResponse({ status: 200, description: '发送成功' })
  @ApiResponse({ status: 400, description: '请求参数错误' })
  @ApiResponse({ status: 500, description: '服务器错误' })
  async testSendEmail() {
    const body = {
      content: `<h1>测试邮件</h1>`
    }
    return await this.emailService.sendEmail(body);
  }
}

